Loggest thine Stuff
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 lines
5.3 KiB

  1. <script lang="ts" context="module">
  2. import type { Load } from "@sveltejs/kit/types/internal";
  3. function generateItemFilters(now: Date): {scheduledFilter: ItemFilter, acquiredFilter: ItemFilter, looseFilter: ItemFilter} {
  4. return {
  5. scheduledFilter: {
  6. scheduledDate: datesOf(parseInterval("next:7d", now)),
  7. },
  8. acquiredFilter: {
  9. acquiredTime: morningInterval(parseInterval("today", now)),
  10. },
  11. looseFilter: {
  12. loose: true,
  13. unAcquired: true,
  14. unScheduled: true,
  15. },
  16. }
  17. }
  18. export const load: Load = async({params, stuff, fetch}) => {
  19. const scopeId = parseInt(params.scope.split("-")[0]);
  20. const client = sl3(fetch, stuff.idToken);
  21. const {acquiredFilter, looseFilter, scheduledFilter} = generateItemFilters(new Date());
  22. const [scheduledItems, acquiredItems, looseItems, sprints] = await Promise.all([
  23. client.listItems(scopeId, scheduledFilter),
  24. client.listItems(scopeId, acquiredFilter),
  25. client.listItems(scopeId, looseFilter),
  26. client.listSprints(scopeId),
  27. ]);
  28. return {
  29. stuff: { title: "Overview" },
  30. props: {scheduledItems, acquiredItems, looseItems, sprints}
  31. };
  32. }
  33. </script>
  34. <script lang="ts">
  35. import { sl3 } from "$lib/clients/sl3";
  36. import { getScopeContext } from "$lib/components/contexts/ScopeContext.svelte";
  37. import Column from "$lib/components/layout/Column.svelte";
  38. import Columns from "$lib/components/layout/Columns.svelte";
  39. import Row from "$lib/components/layout/Row.svelte";
  40. import Option from "$lib/components/layout/Option.svelte";
  41. import OptionsRow from "$lib/components/layout/OptionsRow.svelte";
  42. import StatSubSection from "$lib/components/scope/StatSubSection.svelte";
  43. import DeletionModal from "$lib/modals/DeletionModal.svelte";
  44. import StatCreateEditModal from "$lib/modals/StatCreateEditModal.svelte";
  45. import parseInterval, { datesOf, morningInterval } from "$lib/utils/timeinterval";
  46. import type Item from "$lib/models/item";
  47. import ItemCreateModal from "$lib/modals/ItemCreateModal.svelte";
  48. import Card from "$lib/components/common/Card.svelte";
  49. import CardHeader from "$lib/components/common/CardHeader.svelte";
  50. import SprintCreateUpdateModal from "$lib/modals/SprintCreateUpdateModal.svelte";
  51. import type Sprint from "$lib/models/sprint";
  52. import SprintListContext from "$lib/components/contexts/SprintListContext.svelte";
  53. import SprintList from "$lib/components/scope/SprintList.svelte";
  54. import ItemAcquireModal from "$lib/modals/ItemAcquireModal.svelte";
  55. import { getModalContext } from "$lib/components/contexts/ModalContext.svelte";
  56. import ProjectCreateEditModal from "$lib/modals/ProjectCreateEditModal.svelte";
  57. import ScopeCreateUpdateModal from "$lib/modals/ScopeCreateUpdateModal.svelte";
  58. import type { ItemFilter } from "$lib/models/item";
  59. import ItemMultiListContext from "$lib/components/contexts/ItemMultiListContext.svelte";
  60. import { getTimeContext } from "$lib/components/contexts/TimeContext.svelte";
  61. import ItemListRow from "$lib/components/scope/ItemListRow.svelte";
  62. import Icon from "$lib/components/layout/Icon.svelte";
  63. export let acquiredItems: Item[];
  64. export let scheduledItems: Item[];
  65. export let looseItems: Item[];
  66. export let sprints: Sprint[];
  67. const {scope} = getScopeContext();
  68. const {openModal} = getModalContext();
  69. const {now} = getTimeContext();
  70. function openCreateProject() {
  71. openModal({name: "project.create"});
  72. }
  73. function openPostItem() {
  74. openModal({name: "item.create"});
  75. }
  76. function openEditScope() {
  77. openModal({name: "scope.edit", scope: $scope});
  78. }
  79. function openDeleteScope() {
  80. openModal({name: "scope.delete", scope: $scope});
  81. }
  82. </script>
  83. <ItemMultiListContext lists={{acquiredItems, scheduledItems, looseItems}} filters={generateItemFilters($now)}>
  84. <SprintListContext sprints={sprints} intervalString="">
  85. <Columns fullwidth>
  86. <Column>
  87. <Row title="Options">
  88. <Card on:click={openCreateProject} pointerCursor><CardHeader>Create Project</CardHeader></Card>
  89. <Card on:click={openPostItem} pointerCursor><CardHeader>Create Item</CardHeader></Card>
  90. <Card on:click={openEditScope} pointerCursor><CardHeader>Edit Scope</CardHeader></Card>
  91. <Card on:click={openDeleteScope} pointerCursor><CardHeader>Delete Scope</CardHeader></Card>
  92. </Row>
  93. <ItemListRow title="Scheduled" key="scheduleItems" />
  94. <ItemListRow title="Today" key="acquiredItems" showAcquiredTime />
  95. <ItemListRow title="Loose" key="looseItems" />
  96. </Column>
  97. <Column>
  98. <Row title="Sprints">
  99. <OptionsRow slot="right">
  100. <Option open={{name: "sprint.create"}}><Icon name="plus" /></Option>
  101. </OptionsRow>
  102. <SprintList sub />
  103. </Row>
  104. <Row title="Stats">
  105. <OptionsRow slot="right">
  106. <Option open={{name: "stat.create"}}><Icon name="plus" /></Option>
  107. </OptionsRow>
  108. {#each $scope.stats as stat (stat.id)}
  109. <StatSubSection stat={stat} />
  110. {/each}
  111. </Row>
  112. </Column>
  113. </Columns>
  114. <ItemCreateModal />
  115. <ItemAcquireModal />
  116. <StatCreateEditModal />
  117. <DeletionModal />
  118. <SprintCreateUpdateModal />
  119. <ProjectCreateEditModal />
  120. <ScopeCreateUpdateModal />
  121. </SprintListContext>
  122. </ItemMultiListContext>